﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/problem/214850
/*
题目描述：
链接：https://ac.nowcoder.com/acm/problem/214850
来源：牛客网

给出n个字符串，从第1个字符串一直到第n个字符串每个串取一个字母来构成一个新字符串，新字符串的第i个字母只能从第i行的字符串中选出，这样就得到了一个新的长度为n的字符串，请问这个字符串是否有可能为回文字符串？
输入描述:
第一行一个数字
𝑡
,
1
≤
𝑡
≤
50
t,1≤t≤50,代表测试数据的组数

每组测试数据先给出一个数字 n，然后接下来n行每行一个只由小写字母组成的字符串
𝑠
𝑖
s
i
​


1
≤
𝑛
≤
100
,
1
≤
∣
𝑠
𝑖
∣
≤
50
1≤n≤100,1≤∣s
i
​
 ∣≤50
输出描述:
在一行中输出 “Yes” or “No”
示例1
输入
复制
2
1
a
3
a
b
c
输出
复制
Yes
No
*/

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
using namespace std;
// 开始解题：
// 方法——哈希表
int t = 0, n = 0;
bool _hash[60][26];

int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        memset(_hash, false, sizeof _hash);
        vector<string> strs(n);
        for (int i = 0; i < n; i++) {
            cin >> strs[i];
        }
        int mid = n / 2;
        for (int i = 0; i < mid; i++) {
            for (auto ch : strs[i]) {
                _hash[i][ch - 'a'] = true;
            }
        }
        bool ans = true;
        int index = mid - 1;
        int begin = mid;
        if (n % 2) {
            begin++;
        }
        while (begin < n) {
            bool flag = false;
            for (auto ch : strs[begin]) {
                if (_hash[index][ch - 'a']) {
                    flag = true;
                }
            }
            if (!flag) {
                ans = false;
                break;
            }
            begin++;
            index--;
        }
        if (ans) {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }

    }
    return 0;
}